iT邦幫忙

2023 iThome 鐵人賽

DAY 16
0
AI & Data

OpenAI 從提示工程(Prompt Engineering)到語義核心(Semantic Kernel)的實踐系列 第 16

Semantic Kernel的實踐:Semantic Kernel - 認識 plugins

  • 分享至 

  • xImage
  •  

前言

plugins是Semantic Kernel的核心組成之一,主要功用是封裝能力組成,交由Kernel來運行,提升LLM應用的層面,本篇來認識 plugins。

範例採用C#程式語言,並以主控台應用程式做為示範,使用的是.net 7.0。
此外GPT模型使用的是Azure OpenAI GPT-4,事實也可以依需求改用OpenAI服務,而模型也可以改用GPT-3.5。

認識 plugins

前面我們已經提到透過plugins可以讓LLM模型本身做不到的事,變成可行,看起來就像模型本身的能力,進而提升LLM應用的範疇,例如,我們都知道ChatGPT的訓練集只到2021年,也就是它的大腦資料並未更新,所以如果我們問它2023年的事情,那麼生成的內容,基本上就是胡扯出來的內容,因此如果能結合Bing/google Search,將可以讓ChatGPT能夠從網路搜尋新知識,而這裡的Bing/google Search就是plugin。

https://ithelp.ithome.com.tw/upload/images/20231001/20126569dWReoKBh18.png
(來源: https://learn.microsoft.com/en-us/semantic-kernel/media/cross-platform-plugins.png )

簡單來說就像目前OpenAI ChatGPT開放給訂閱戶的Plugins功能一樣,那麼如果我們的LLM應用也想要做,又該怎麼做呢?

在Semantic Kernel裡就是plugins機制(過去稱為Skills),Semantic Kernel內建了一些開箱即用的plugins,當然開發者也可以自行撰寫Native Function的plugin。而在設計plugins時,通常是一系列能力的組成,例如可以建立一個叫做"寫手"的plugin,而這個"寫手"可以具有

  • 文字風格改寫的能力
  • 摘要總結的能力
  • 翻譯文字的能力
  • 內容改寫的能力。

plugins其實是結合了prompt engineering與程式碼。

Kernel在調用plugins時,有二種方式

  • 手動調用,由程式邏輯安排調用
    這個方式就是傳統程式設計方式,在程式內依邏輯決定叫什麼plugin,所以是開發者可以控制的。
  • 經由Planner自動安排調用
    這個方式是以AI為角度出發,認為Kernel本身可以自動理解程序,決定調用合適的plugin,所以是不可控的。

在設計plugins時,為了滿足"Planner自動安排調用"的能力,所以需要用語義的方式詳細描述這個plugins的行為,包含輸入/輸出,如此一來才能讓Planner能夠從語義上理解這個plugins的行為,進而在合適的情境調用該plugins。

Planner 規劃器,會在後續系列文做說明。

https://ithelp.ithome.com.tw/upload/images/20231001/20126569qHSrdpF7az.png
( 來源:https://learn.microsoft.com/en-us/semantic-kernel/media/writer-plugin-example.png )

plugin在設計上分成二大類,分別是Semantic functions與Native functions

Semantic functions

主要的組成是 prompt engineering,以及LLM模型的參數配置,可以想像成是與LLM模型做互動對話。所以在開發上prompt engineering會決定這個語義函數的能力。例如:

語義函數如何設計,在下一篇文章再來細部說明

{
     "schema": 1,
     "type": "completion",
     "description": "你是一位臉書小編,依下列主題撰寫語氣可愛風格的貼文,貼文內容不超過500個字,#zh-tw",
     "completion": {
          "max_tokens": 1500,
          "temperature": 0.6,
          "top_p": 0.0,
          "presence_penalty": 0.0,
          "frequency_penalty": 0.0
     },
     "input": {
          "parameters": [
               {
                    "name": "subject",
                    "description": "貼文的主題",
                    "defaultValue": ""
               }
          ]
     }
}

Native functions

主要的組成是程式碼C# 或 Python,可供Kernel調用,簡單的說就是開發者一般日常熟悉的function撰寫。因為在LLM模型的能力是有限的,例如:LLM模型並沒有讀取檔案的能力、沒有寫資料到資料庫的能力、也沒有調用API的能力,於是實務上在開發LLM應用,會有許多機會需要提供這類的Plugins

試想看看,如果要LLM模型回答今天的日期是什麼,LLM模型本身是無法回答的,所以必須有個Function可取得電腦時間,而這個Function的程式碼內容,就會是個C#的DateTime.Now。

[SKFunction, Description("Get DateTime from local")]
public DateTime GetDateTimeAsync()
{
    return DateTime.now;
}

結語

本篇內容主要帶大家認識Semantic的plugins,而這也是在開發LLM應用一定會面對的核心區域,有了對plugins的基本認識後,接下來將會對如何建立Semantic functions與Native functions做細部的教學。

嗨,我是Ian,我喜歡分享與討論,今年跟2位朋友合著了一本ChatGPT主題書,如果你是一位開發者,這本書或許會有些幫助,https://www.tenlong.com.tw/products/9786263335189
這次的鐵人賽文章也會同時發佈於個人blog,歡迎關注我的blog : https://medium.com/@ianchen_27500


上一篇
Semantic Kernel的實踐:Semantic Kernel - 配置 Kernel
下一篇
Semantic Kernel的實踐:Semantic Kernel - Plugins開發篇 Semantic functions (Part 1)
系列文
OpenAI 從提示工程(Prompt Engineering)到語義核心(Semantic Kernel)的實踐30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言